package handler;

import dao.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.RollbackException;
import pojo.Categoria;
import pojo.Exemplar;
import pojo.Filme;
import pojo.Locacao;

/**
 *
 * @author Vanessinha
 */
@Named(value = "locacaoHandler")
@SessionScoped
public class LocacaoHandler implements Serializable {

    @EJB
    private LocacaoDao locacaodao = new LocacaoDao();
    @EJB
    private ClienteDao clientedao = new ClienteDao();
    @EJB
    private FuncionarioDao funcionariodao = new FuncionarioDao();
    @EJB
    private ExemplarDao exemplardao = new ExemplarDao();
    @EJB
    private CategoriaDao categoriadao = new CategoriaDao();
    private Exemplar exemplar = new Exemplar();
    private Locacao locacao = new Locacao();
    private List<Locacao> listalocacao = new ArrayList<>();
    private Locacao excluido;
    private long idCliente;
    private long idFuncionario;
    private long idCategoria;
    private long idExemplar;
    private long idFilme;
    private List<Exemplar> exemplares = new ArrayList<>();
    private List<Exemplar> listaDisponiveis = new ArrayList<>();
    private List<Filme> filmes = new ArrayList<>();
    public LocacaoHandler() {
    }

    public long getIdFilme() {
        return idFilme;
    }

    public void setIdFilme(long idFilme) {
        this.idFilme = idFilme;
    }

    public List<Filme> getFilmes() {
        return filmes;
    }

    public void setFilmes(List<Filme> filmes) {
        this.filmes = filmes;
    }

    public List<Exemplar> listaDisponiveis() {
        return listaDisponiveis = exemplardao.listaExemplaresDisponiveis();
    }

    public Locacao getExcluido() {
        return excluido;
    }

    public void setExcluido(Locacao excluido) {
        this.excluido = excluido;
    }

    public Exemplar getExemplar() {
        return exemplar;
    }

    public void setExemplar(Exemplar exemplar) {
        this.exemplar = exemplar;
    }

    public List<Exemplar> getExemplares() {
        return exemplares;
    }

    public void setExemplares(List<Exemplar> exemplares) {
        this.exemplares = exemplares;
    }

    public long getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(long idCategoria) {
        this.idCategoria = idCategoria;
    }

    public long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(long idCliente) {
        this.idCliente = idCliente;
    }

    public long getIdExemplar() {
        return idExemplar;
    }

    public void setIdExemplar(long idExemplar) {
        this.idExemplar = idExemplar;
    }

    public long getIdFuncionario() {
        return idFuncionario;
    }

    public void setIdFuncionario(long idFuncionario) {
        this.idFuncionario = idFuncionario;
    }

    public List<Exemplar> getListaDisponiveis() {
        return listaDisponiveis;
    }

    public void setListaDisponiveis(List<Exemplar> listaDisponiveis) {
        this.listaDisponiveis = listaDisponiveis;
    }

    public List<Locacao> getListalocacao() {
        return listalocacao;
    }

    public void setListalocacao(List<Locacao> listalocacao) {
        this.listalocacao = listalocacao;
    }

    public Locacao getLocacao() {
        return locacao;
    }

    public void setLocacao(Locacao locacao) {
        this.locacao = locacao;
    }

    public String salvar() {

        if (exemplares.isEmpty()) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "CAMPO OBRIGATÓRIO", "Campo exemplar obrigatório."));
        } else {
            locacao.setExemplares(exemplares);
            locacao.setLoccodCategoria(categoriadao.pesquisar(idCategoria));
            locacao.setLoccodCliente(clientedao.pesquisar(idCliente));
            locacao.setLoccodFuncionario(funcionariodao.pesquisar(idFuncionario));
            locacaodao.inserir(locacao);
            cancelar();
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "CONFIRMAÇÃO",
                    "Cadastrado realizado com sucesso!"));
        }
        return "CadastroLocacao.xhtml";
    }

    public List<Locacao> listalocacao() {
        return listalocacao = locacaodao.getAll();
    }

//    public String removerlocacao(Locacao obj) {
//        try {
//            locacaodao.excluir(obj);
//            cancelar();
//            FacesContext context = FacesContext.getCurrentInstance();
//            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
//                    "CONFIRMAÇÃO", "Registro removido com sucesso!"));
//        } catch (RollbackException e) {
//            FacesContext context = FacesContext.getCurrentInstance();
//            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,
//                    "ATENÇÃO", "Registro já esta em uso, não pode ser removido."));
//        }
//        return "CadastroLocacao.xhtml";
//    }
    public void parametroRemover(ActionEvent event) {
        UIComponent link = event.getComponent();
        UIParameter param = (UIParameter) link.findComponent("idParaRemover");
        excluido = (Locacao) param.getValue();
    }

    public void remover() {
//        removerlocacao(excluido);
        excluido = null;
    }

    public void alterar(Locacao obj) {
        idCategoria = obj.getLoccodCategoria().getCatCodigo();
        idCliente = obj.getLoccodCliente().getCliCodigo();
        exemplares = obj.getExemplares();
        idFuncionario = obj.getLoccodFuncionario().getFunCodigo();
        obj = locacaodao.pesquisar(obj.getLocCodigo());
        this.locacao = obj;
    }

    public String cancelar() {
        listaDisponiveis = exemplardao.listaExemplaresDisponiveis();
        locacao = new Locacao();
        idCategoria = 0L;
        idCliente = 0L;
        idExemplar = 0L;
        idFuncionario = 0L;
        exemplares = new ArrayList<>();
        return "CadastroLocacao.xhtml";
    }

    public String adicionarExemplar() {
        Exemplar ex = exemplardao.pesquisar(idExemplar);
        System.out.println("==========================" + ex);

        exemplares.add(ex);

//        for (Exemplar p : listaDisponiveis) {
//            if (p.getCod_exemplar().equals(idExemplar)) {
        listaDisponiveis.remove(ex);
//                idExemplar = 0L;
//                break;
//            }
//        }
        return "CadastroLocacao.xhtml";
    }

    public String removerExemplar(Exemplar obj) {
        this.locacao.getExemplares().remove(obj);
        this.exemplares.remove(obj);
        idCategoria = 0L;
        idCliente = 0L;
        idFuncionario = 0L;
        idExemplar = 0L;
        listaDisponiveis.add(obj);
        return "CadastroLocacao.xhtml";

    }

    public void popularFilmes() {
        filmes = categoriadao.pesquisar(idCategoria).getFilmes();
    }
}
